跳到主要内容

1.1-JS基础知识

Create by fall on — — 2020 Recently revised in 21 Nov 2024

发展史

1995 年 JavaScript 诞生。

ES6 其实是泛指,2015 年六月发布 ES6 第一个版本,然后规定,每年的六月发布一次正式版本,版本号以当年年份为准 ES6。

一般来讲,新增的 JavaScript 的语法通常要经历以下五个阶段

阶段英文名含义
Stage 0Strawperson展示阶段
Stage 1Proposal征求意见阶段
Stage 2Draft草案阶段
Stage 3Candidate候选阶段
Stage 4Finished定案阶段

ES6 改进了前端编程体验,带来更多方便使用的特性,并且适用范围最广,所以本笔记也以 ES6 的内容为基础进行编写。

JavaScript 标准委员会 TC39 提出的实验性功能。在浏览器中的支持是有限的,但是可以通过 Babel 添加语法解析或提供 API 使用此功能。

变量

变量声明

可以声明三种变量类型

普通变量var

  • var 声明的作用域是函数作用域,在整个函数内都有效
  • 可以被声明多次

局部变量let ,只在块级作用域内生效

  • 只要遇到大括号都会形成作用域,只在该大括号内可以使用该变量。
  • 只能被声明一次

声明常量const

  • const 声明的变量,只能在声明的时候确定值(或者是指针),后续没有办法修改
  • 常量的作用域和 let 相同,也是只能声明一次

为什么要引入 let 和 const

  • let、const 声明的变量不会被提升。在 javascript 引擎编译后,会保存在词法环境中
  • 块级作用域在代码执行时,将 let、const 变量存放在词法环境的一个单独的区域。词法环境内部维护一个小型的栈结构,作用域内部变量压入栈顶。作用域执行完,从栈顶弹出
var foo = ""
let foo1 = ""
const foo2 = ""

块级作用域有例外,比如 letfor 循环的小括号中使用时,虽然在小括号内,但作用域会被提取到每个大括号中的内容。为了方便编写代码。

for 小括号中使用 var 变量是可以在循环之后进行访问的,如果在循环中使用的是 let,在循环后无法使用。

let 不能在变量声明之前访问该变量,var 可以访问并且不会报错,但值为 undefined

const 声明对象或者数组时,只是不能更改指向,可以添加,或者删除对象上的属性。

变量类型

在 JS 中,只需声明变量,由引擎判断所属类型,目前为止共有九个类型

  • Data Types(六个数据类型) :undefined、Boolean、Number、String、BigInt、Symbol
  • Structural Types (两个构造类型):Object、Function、
  • Structural Root (一个原始数据类型):null

注意:没有 Array 数据类型,本质上 Array 是继承 Object,在此基础上,浏览器会做一些优化,所以 typeof arr 类型为 'object'

注释

三种类型的注释:

// 区间注释,在区域内部,都是注释
const find1 /* 一些内容 */ = 99
const find2 = 99 /* 一些
内容 */
// 行尾注释
console.log(find1) // 输出 find1

js doc

方法注释,方法注释会帮助编辑器(VS Code)进行提示

/**
* 从对象中移除属性
* @param {number} a 加数
* @param {number} b 加数
* @return {number} sum 和
*/
function sum(a,b){
return a+b
}

/**
 * @deprecated use {@link sum} instead
*/
function abandoned(a,b){
return a+b
}

严格模式

严格模式是对语法进行额外限制,使代码更明确。

use strict 是一种运行时自动执行更严格的 JavaScript 代码解析和错误处理的方法。如果代码错误被忽略或失败,将会产生错误或抛出异常。

非严格模式下

a = 100
console.log(a) // 100

严格模式下

"use strict"
a = 100
console.log(a) // 我直接给你报错!Error!

ES6 的模块自动采用严格模式,不管你有没有在模块头部加上 "use strict"

严格模式主要有以下限制:

  • 变量必须声明后再使用
  • 函数的参数不能有同名属性,否则报错
  • 不能使用 with 语句
  • 不能对只读属性赋值,否则报错
  • 不能使用前缀 0 表示八进制数,否则报错
  • 不能删除不可删除的属性,否则报错
  • 不能删除变量delete prop ,会报错,只能删除属性 selete global[prop]
  • eval 不会在它的外层作用域引入变量
  • eval和arguments不能被重新赋值
  • arguments不会自动反映函数参数的变化
  • 不能使用arguments.callee
  • 不能使用arguments.caller
  • 禁止this指向全局对象,此 this 指向 undefined,能避免在顶层使用 this,和顶层使用 this 报错。
  • 不能使用fn.caller和fn.arguments获取函数调用的堆栈
  • 增加了保留字(比如protected、static和interface)

严格模式是ES5引入的,上面这些限制,模块都必须遵守。

严格模式的好处:

  • 使调试跟更容易。如果代码错误本来会被忽略或失败,那么现在将会产生错误或抛出异常,从而更快地发现代码中的问题,并更快地指引它们的源代码。

  • 防止意外全局。如果没有严格模式,将指赋值给未声明的变量会自动创建一个具有该名称的全局变量。这是JavaScript中最常见的错误之一。在严格模式下,会直接报错。

  • 消除隐藏威胁。在没有严格模式的情况下,对null或undefined的这个值得引用会自动强制到全局。这可能会导致需要headfakes和pull-out-your-hair类型的错误。在严格模式下,因公用null或undefined的这个值会引发错误。

  • 不允许重复的参数值。严格模式在检测到函数的重复命名参数(例如,函数foo(var1,var2,var1))时会引发错误,从而捕获代码中几乎可以肯定存在的错误,否则会浪费大量的时间追踪命名上的问题。

    注意:它曾经是(ECMAScript 5 中)strict模式将禁止重复的属性名称(例如:var object = {foo:“bar”,foo:“baz”};)但是从ECMAScript 2015 开始,就不再有这种情况了。

  • 使 eval() 更安全。eval() 在严格模式和非严格模式下的行为方式有些不同。最重要的是,在严格模式下,在 eval() 语句内部声明的变量和函数不会再包含范围中创建(它们是以非严格模式在包含范围中创建的,这也可能是问的常见来源)。

  • 抛出无效的使用错误的删除符。删除操作符(用于从对象中删除属性)不能用于对象的不可配置属性,当试图删除一个不可配置的属性时,非严格代码将自动失败,而在这种情况下,严格模式会引发错误

参考文章:

文章标题地址
"use strict" 的意义和好处https://blog.csdn.net/qq_36379070/article/details/82586892